#ifndef PROTOCOLO_H
#define PROTOCOLO_H

#include <cstddef>
#include <string>

/** Definicion de mensajes Cliente/Servidor */

/***************************** PETICIONES CLIENTE ****************************/

/* Tipos de "req_type" enviados por el cliente */
// PETICIONES PUBLICAS: sin autenticar
#define REQ_AUTENTICAR 1
#define REQ_CREAR_USUARIO 2
#define REQ_DESCONECTAR 3

// PETICIONES AUTENTICADAS: firma HMAC 
// (setear key password antes de serializar)
// Devuelve lista de partidos.
// Atributos: nombre
#define REQ_PARTIDOS 4

// Atributos: nombre
#define REQ_UNIR_A_PARTIDO 5
#define REQ_CREAR_PARTIDO 6

// Mensaje con comando a despachar al partido en juego
#define REQ_COMANDO_PARTIDO 8

// Tipos de comando:
#define TIPO_COM_MOVER 0
#define TIPO_COM_DESCONECTAR_JUGADOR 3
#define TIPO_COM_FINALIZAR 4

// El usuario en la sala sale de la partida a la que se unió.
#define REQ_OUT_USER 9

/***************************** ***********************************************/

/* Creacion de usuario: Mensajes de respuesta al cliente */
#define MENSAJE_USUARIO_CREADO "USUARIO_CREADO"
#define MENSAJE_USUARIO_EXISTE "USUARIO_EXISTE"

/* Mensajes de error generales */
#define MENSAJE_MAL_FIRMADO "MAL_FIRMADO"
#define MENSAJE_INVALIDO "MENSAJE_INVALIDO"
#define MENSAJE_ERROR "ERROR"
#define MENSAJE_NO_AUTENTICADO "NO_AUTENTICADO"

/**** Autenticacion: Mensajes de respuesta al cliente ****/
#define MENSAJE_AUTH_OK "AUTH_OK"
#define MENSAJE_AUTH_NO_EXISTE "USUARIO_NO_EXISTE"
#define MENSAJE_AUTH_NOK "AUTH_NOK"
// El cliente ya se encontraba autenticado.
#define MENSAJE_AUTH_AUTENTICADO "USUARIO_YA_AUTENTICADO"

/* Errores */
#define ERROR_SIN_PARTIDO "SIN_PARTIDO"

/********************** NOTIFICACIONES DEL SERVIDOR **************************/

#define NOT_TYPE_ADD_PARTIDA 1
#define NOT_TYPE_ADD_USER 2
#define NOT_TYPE_REMOVE_GAME 3
#define NOT_TYPE_ANWSER_JOIN 4
#define NOT_TYPE_START_GAME 5
#define NOT_OUT_USER 8 
#define NOT_UPDATE_BOARD 9 
#define NOT_PARTIDOS 10 
#define NOT_FIN_PARTIDO 11 
#define NOT_TYPE_INVALID_MOV 12 

// NOT_FIN_PARTIDO - "Razones de finalización"
#define FIN_GANADOR "GANADOR" 
#define FIN_CANCELACION "CANCELADO" 
#define FIN_SIN_MOVIMIENTOS "SIN_MOVIMIENTOS"

/********************* COMANDOS DE PARTIDO **********************************/

class Protocolo {
public:
    Protocolo() {}
    virtual ~Protocolo() {}

    static std::string notToString(int not_type);
    static std::string reqToString(int not_type);
};



#endif
